home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Almathera Ten Pack 2: CDPD 1
/
Almathera Ten on Ten - Disc 2: CDPD 1.iso
/
pd
/
076-100
/
087
/
claz
/
claz.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-03-13
|
5KB
|
206 lines
/* CLAZ.c v2.0 */
/* by Steve Ludtke */
/* Created : 05/31/87 */
#include<stdio.h>
#include<math.h>
#include<exec/types.h>
/* define IFF structures */
struct CMAP {
UBYTE r,g,b;
};
struct BMHD {
UWORD w,h;
WORD x,y;
UBYTE npl;
UBYTE masking,compression,pad1;
UWORD tcolor;
UBYTE xas,yas;
WORD pWid,pHig;
};
char *malloc();
main (argc,argv)
int argc;
char *argv[];
{
struct BMHD mhd;
long *len1,*len2,cnt,rsz,m,h,i,j,k,d,lr,lb,lg,q1,q2,x1,x2,y1,y2,fl;
int fl1,b;
BYTE t;
UBYTE cmap[100];
char *raster,*rp,*fspin,*outfsp,hex[20],msc1[12],q,x,y,c,msc2[8],*misc;
FILE *fin,*fout;
hex[0]='0'; hex[1]='1'; hex[2]='2'; hex[3]='3';
hex[4]='4'; hex[5]='5'; hex[6]='6'; hex[7]='7';
hex[8]='8'; hex[9]='9'; hex[10]='A'; hex[11]='B';
hex[12]='C'; hex[13]='D'; hex[14]='E'; hex[15]='E';
fl=0; x1=10; y1=10; x2=550; y2=480;
/* Get enough memory, figure out filespecs */
raster=malloc(200000);
misc=malloc(2000);
if (raster==NULL) { printf("Not enough memory.\n"); exit(0); }
if (argc<3) outfsp="out.ps";
if (argc>2) outfsp=argv[2];
if (argc>3) {
sscanf(argv[3],"%ld",&x1);
sscanf(argv[4],"%ld",&y1);
sscanf(argv[5],"%ld",&x2);
sscanf(argv[6],"%ld",&y2);
}
if (argc==8 || argc==4) fl|=1;
printf("\n\n CLAZ - IFF to POSTSCRIPT converter V2.0\n");
printf(" by Steve Ludtke\n");
printf(" N\251 - No Copyright 1987\n\n");
printf("File in : ");
if (argc>1) {
fspin=argv[1];
printf("%s\n",fspin);
}
if (argc==1) {
fspin=malloc(80);
scanf("%s",fspin);
}
fin=fopen(fspin,"r");
if (fin==NULL) { printf("Sorry, can't open input file.\n"); exit(0); }
if ((fread(msc1,12,1,fin))==0) { printf("Sorry, input file problem #1. \n"); exit (0); }
len1=(long *)&msc1[4];
printf("main : %d,%s\n",*len1,msc1);
cnt=14;
/* *len1=# bytes in file according to IFF */
/* msc2=the name of the current chunk */
/* *len2=# bytes in current chunk */
/* by the way, UNID is symply any chunk the program doesn't deal with */
/* Reads in the IFF file : */
while(cnt < *len1) {
fl1=0;
if ((fread(msc2,8,1,fin))==0) { printf("Sorry, bad input file. \n"); exit(0); }
len2=(long *)&msc2[4];
if (strncmp(msc2,"CMAP",4)==0) {
if ((fread(cmap,*len2,1,fin))==0) { printf("Sorry, bad CMAP. \n"); exit(0); }
printf("CMAP\n");
fl1=1;
}
if ((strncmp(msc2,"BMHD",4))==0) {
if ((fread(&mhd,*len2,1,fin))==0) { printf("Sorry, bad BMHD. \n"); exit(0); }
printf("BMHD\n");
fl1=1;
}
if (strncmp(msc2,"BODY",4)==0) {
printf("BODY\n");
fl1=1;
m=0; rp=raster;
if (mhd.compression==1) {
while (m<=*len2) {
t=getc(fin); m++;
if (t>=0) {
t++;
fread(rp,(long) t,1,fin);
rp+=t;
m+=t;
}
if (t<0) {
t=(-t)+1;
c=getc(fin);
m++;
for (i=0; i<t; i++) {
*rp=c; rp++; }
}
}
}
if (mhd.compression==0) {
if ((fread(rp,*len2,1,fin))==0) { printf("Sorry, bad BODY. \n"); exit(0); }
printf("No Comression\n");
}
if (mhd.compression>1) { printf("Sorry, unknown compression type.\n");
exit(0); }
}
if (fl1==0) {
if (*len2>2000) { printf("Sorry, UNID too long.\n"); exit(0); }
if ((fread(misc,*len2,1,fin))==0) { printf("Sorry, UNID bad. \n"); exit(0); }
printf("UNID\n");
}
cnt+=*len2;
cnt+=8;
}
fclose(fin);
free(fspin);
if ((fout=fopen(outfsp,"a"))==NULL) { printf("Sorry, cannot open output file.\n"); exit(0); }
/* Standard POSTSCRIPT program, the only part following the data is */
/* the showpage command. */
fprintf(fout,"[0 0 0 0 0 0] defaultmatrix setmatrix");
fprintf(fout,"/picstr %d string def\r",mhd.w);
fprintf(fout,"%ld %ld translate\r",x1,y1);
fprintf(fout,"%ld %ld scale\r",x2,y2);
fprintf(fout,"%d %d 4 [%d 0 0 -%d 0 %d]\r",mhd.w,mhd.h,mhd.w,mhd.h,mhd.h);
fprintf(fout,"{currentfile picstr readhexstring pop} image\r");
/* calculate and output file */
lb=lr=lg=0;
rsz=mhd.w*mhd.h/8;
printf("rast size : %d #planes : %d\n",rsz,mhd.npl);
for (h=0; h<96; h++) cmap[h]=cmap[h]/16;
for (h=0; h<mhd.h; h++) {
for (i=0; i<mhd.w/8; i++) {
for(k=7;k>=0;k--) {
b=0;
for(j=0; j<mhd.npl; j++) {
c=(raster[h*(mhd.w/8)*mhd.npl+i+((mhd.npl-j-1)*mhd.w/8)]);
c=c>>k;
c&=1;
b|=c;
b<<=1;
}
b>>=1;
/* this is for HAM pictures */
if (mhd.npl==6) {
c=(b&48)>>4;
b&=15;
if (c==0) {
b*=3;
lr=cmap[b]; lb=cmap[b+1]; lg=cmap[b+2];
}
if (c==1) lb=b;
if (c==2) lr=b;
if (c==3) lg=b;
}
if (mhd.npl!=6) {
b&=31;
b*=3;
lr=cmap[b]; lb=cmap[b+1]; lg=cmap[b+2];
}
m=lr+lb+lg; m=m/3;
if (m<0) m=0;
if (m>14) m=14;
putc(hex[m],fout);
}
}
}
fprintf(fout,"\r");
/* Hold the 'showpage' if there is an appended character */
if (!(fl&1)) fprintf(fout,"showpage\r");
fclose(fout);
printf("Done !!!\n");
free(misc);
free(raster);
}